[t:/]$ 지식_

눈에 보이지 않는 CR, LF, NULL

2013/03/06

C++을 쓰면 문제 없지만 C에서는 여전히 괴롭히는 문제다.

아주 초보적인 이슈인데도 당해서 벙찔 때가 있음.

문자열의 끝은 0, NULL, ‘\0’ 다 같은 뜻이다.

나는 귀찮아서 그냥 0을 쓰는데 이걸 일일히 바로잡는 분들도 있다 -_-;

NULL은 컴파일러에 따라 속성을 갖기도 한다. 예를 들어 (void *)NULL 일 수도 있다. 이건 C에서는 어차피 다 똑같이 0이다.

그런데 C++에 들어가면 대개 경고를 때린다. 컴파일러 옵션을 엄격하게 주면 에러를 뱉는다. 어차피 어셈 코드 보면 0이고, C 개발자 입장에선 참 쒯스럽지만 어쩔 수 없다.

배열을 선언할 때를 보자

char c[3];

이것은 3칸이다. 따라서 c[2] 까지만 쓸 수 있다.

헌데 문자열의 마지막은 0으로 끝나야 한다. 따라서 c[1] 까지만 쓸 수 있다. 따라서 c[3]은 2글자만 저장할 수 있고 c[1] 까지만 쓸 수 있다.

CR, LF를 보자.

CR은 아스키넘버 13이다. = 0xD = 대부분의 에디터에서 ^M으로 표시된다. 커서를 줄 맨 앞으로 보낸다. 라인 프린터에서 헤드를 맨 앞으로 옮기는 역할을 했다.

LF는 아스키넘버 10이다. = 0xA = 잘 표현되진 않지만 ^J로 표시된다. \n과 같다. 줄을 바꾼다. 라인 프린터에서 한 줄 올리는 역할을 했다;;

따라서 CRLF 가 한조가 되어야 줄바꿈이 된다. 그런데 UNIX 계통에서는 LF만 있어도 된다. 도스, 윈도우 계통에서는 CRLF가 있어야 한다.

터미널 관련 프로그램을 짤 때 유닉스 계통에서는 \n만 넣으면 줄바꿈이 된다. 이것을 도스용 터미널로 열면 깨져보일 수가 있고 \r\n을 다 넣아야 되는 경우도 있다.

도스 계통에서 저장한 파일을 유닉스 계통에서 열면 ^M이 다 붙어 있을 수 있다. 어쨌든 이런 글자들은 눈에 안 보이지만 존재한다.

문자열을 다룰 때 주의하면 되는데… \r\n 이야 눈에 금방 보이지만 글자 수를 맞출 때 주의해야 한다. MSX나 도스용 라인에디터에서는 ctrl + M 키가 CRLF 였다. ^M은 단축키 CTRL+M을 뜻한다.





공유하기













[t:/] is not "technology - root". dawnsea, rss